package smallfrench.moteur.noeuds;

import smallfrench.moteur.biblio.AObjet;
import smallfrench.moteur.biblio.err.ErreurClasse;
import smallfrench.moteur.biblio.err.ErreurVariableIndefinie;
import smallfrench.moteur.interp.Portee;
import smallfrench.moteur.interp.RObjet;
import smallfrench.moteur.interp.err.RException;
import smallfrench.moteur.lexer.lexemes.Lexeme;

/**
 * Opérateur "." d'accès aux éléments d'un objet.
 * @author antoine1023
 */
public class NPoint extends NIdentificateur implements Assignable {

	public final Noeud noeudObjet;

	public NPoint(Lexeme t, Noeud objet, String nomElement) {
		super(t, nomElement);
		noeudObjet = objet;
	}

	@Override
	public RObjet evaluer(Portee pile) {
		RObjet o = noeudObjet.evaluer(pile);
		RObjet membre = o.getMembre(nom);

		if (membre == null) {
			ErreurVariableIndefinie evi = new ErreurVariableIndefinie(nom);
			evi.ajouterPosition(noeudObjet.lexeme.debut);
			throw new RException(evi);
		}

		return membre;
	}

	@Override
	public void assigner(RObjet nouvelleValeur, Portee pile) {

		RObjet o = noeudObjet.evaluer(pile);

		if (o instanceof AObjet) {
			((AObjet)o).champs.put(nom, nouvelleValeur);
			// System.out.println("NPoint.assigner() " + ((AObjet)o).champs);
		} else {
			throw ErreurClasse.nouvelleException(
					noeudObjet.lexeme.debut, o, "Objet");
		}
	}

	@Override
	public String toString() {
		return noeudObjet + "." + nom;
	}
}
